package collection;

import java.util.Arrays;

/**
 * 自定义实现一个ArrayList
 */
public class MyCollection_ArrayList<E> {
    private Object[] elementDate;//创建一个核心数组
    private int size;
    //static 必须有  因为单例模式的方法是static 调用的属性必须是静态属性 如果不是静态属性 会发生指令重排序 导致先调用方法后加载属性 ，加载不到属性就会报错，同时static本质上是为了全局唯一
    private static final int DEFALT_CAPACITY = 10;//定义一个初始数组长度(常量)

    public  MyCollection_ArrayList(){
        elementDate = new Object[DEFALT_CAPACITY];//默认数组长度
    }

    //如果传入数组的长度
    public  MyCollection_ArrayList(int capacity){
        elementDate = new Object[capacity];
    }

    //get
    public E get(int index){
        return (E)elementDate[index];
    }

    //set
    public void set(int index,E element){
        elementDate[index]=element;
    }

    //设置值
    public void add(E obj){
        //什么时候扩容
        if(size==elementDate.length){
        //怎么扩容
            Object[] newArray = new Object[elementDate.length+(elementDate.length>>1)];//新数组长度为原来数组长度+原长度/2
            System.arraycopy(elementDate,0,newArray,0,elementDate.length);
            elementDate = newArray;
        }
        elementDate[size++]=obj;
    }
    //删除
    public void remove(E element){
        //element将它和所有元素挨个比较，获得第一个为true的，返回
        for(int i=0;i<size;i++){
            if(element.equals(get(i))){//容器中所有的比较操作都是equals，而不是==
                //将该元素移除
                remove(i);
            }
        }
    }

    public void remove(int index){
        int numMoved = elementDate.length-index-1;//移除点，后面的数据
        if(numMoved>0) {
            System.arraycopy(elementDate, index + 1, elementDate, index, numMoved);

        }
        elementDate[--size]=null;
    }

    //重写toString来获取值
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        //[a,b,c]
        sb.append("[");
        for (int i=0;i<size;i++){
            sb.append(elementDate[i]+",");
        }
        sb.setCharAt(sb.length()-1,']');
        return sb.toString();
    }

    public static void main(String[] args) {
        MyCollection_ArrayList s1 = new MyCollection_ArrayList(20);
       for(int i=0;i<40;i++) {
           s1.add("xx" + i);
       }

        s1.set(10,"sdsds");
        System.out.println(s1.toString());
        System.out.println(s1.get(10));
        s1.remove(10);
        System.out.println(s1.get(10));
        s1.remove("xx11");
        System.out.println(s1.get(10));
    }
}
